<?php

define('AUTH_KEY', "############################");
define('LISTEN_CHECK', "############################");
define('DEBUG', false); 

error_reporting(0);

if (file_exists(__DIR__ . '/SocketLog.php')) {
    include_once __DIR__ . '/SocketLog.php';
    slog($_FILES);
}

 

// 新增：路径规范化函数
function normalizePath($path) { 
    $path = str_replace('\\', '/', $path);
    $path = preg_replace('|/{2,}|', '/', $path); 
    return rtrim($path, '/');
}
 
// 新增：错误日志记录函数
function logError($message) {
    if (!DEBUG) return;
    error_log("[" . date('Y-m-d H:i:s') . "] " . $message . "\n", 3, __DIR__ . '/error-EditToServer-'.date('Y-m-d').'.log');
}

if (!isset($_GET['key']) || !isset($_GET['machine_id']) || $_GET['key'] !== AUTH_KEY || md5(md5($_GET['machine_id']).md5($_GET['machine_id'])) !== LISTEN_CHECK) {
    echo 'AUTH ERROR |'.$_GET['machine_id'].'|'.LISTEN_CHECK.'|'.md5(md5($_GET['machine_id']).md5($_GET['machine_id']));
    exit;
}

// 处理目录列表请求
if (isset($_GET['action']) && $_GET['action'] === 'list') {
    $dirs = [];
    $path = realpath(__DIR__);
    while ($path !== false && $path !== dirname($path)) {
        $dirs[] = $path;
        $path = dirname($path);
    }
    echo base64_encode(AUTH_KEY . json_encode(array_reverse($dirs), JSON_UNESCAPED_UNICODE) . AUTH_KEY);
    exit;
}

// 处理POST请求
if (isset($_POST['action'])) {
    $data = $_POST;
    $result = '';

    switch ($data['action']) {
        case 'RENAME':
            $result = isset($data['old_path'], $data['new_path'], $data['is_dir'])
                ? renameFileOrDirectory($data['old_path'], $data['new_path'], filter_var($data['is_dir'], FILTER_VALIDATE_BOOLEAN))
                : '参数不完整';
            break;

        case 'CREATE':
            if (isset($data['path'], $data['is_dir'])) {
                $isDir = filter_var($data['is_dir'], FILTER_VALIDATE_BOOLEAN);
                $result = $isDir ? createFolder($data['path']) : createFile($data['path']);
            } else {
                $result = '参数不完整';
            }
            break;

        case 'REMOVE':
            $result = isset($data['path']) ? removeFileOrDirectory($data['path']) : '参数不完整';
            break;

        case 'MODIFY':
            $result = isset($data['path'], $data['is_dir'])
                ? modifyFileOrDirectory($data['path'], filter_var($data['is_dir'], FILTER_VALIDATE_BOOLEAN))
                : '参数不完整';
            break;

        default:
            $result = '未知操作';
    }

    
    echo $result;
    exit;
}

function renameFileOrDirectory($oldPath, $newPath, $isDir)
{
    $oldPath = normalizePath($oldPath);
    $newPath = normalizePath($newPath);

    if (!file_exists($oldPath)) {
        if ($isDir) {
            // 如果是目录且不存在，直接创建新目录
            if (mkdir($newPath, 0777, true)) {
                return '新目录创建成功';
            } else {
                $errorMessage = '新目录创建失败: ' . error_get_last()['message'];
                logError($errorMessage);
                return $errorMessage;
            }
        } else {
            // 如果是文件且不存在，检查是否有上传的文件
            if (isset($_FILES['file'])) {
                $uploadResult = moveUploadedFile($_FILES['file'], $newPath); 
                if (!$uploadResult) {
                    $errorMessage = '文件上传失败: ' . error_get_last()['message'];
                    logError($errorMessage);
                    return $errorMessage;
                }
                return '操作成功';
            }
            $errorMessage = '原文件不存在,且未提供新文件,操作失败';
            logError($errorMessage);
            return $errorMessage;
        }
    }

    if (file_exists($newPath)) {
        $errorMessage = '新文件名已存在';
        logError($errorMessage);
        return $errorMessage;
    }

    if ($isDir && !is_dir($oldPath)) {
        $errorMessage = '指定为目录，但原路径不是目录';
        logError($errorMessage);
        return $errorMessage;
    }

    if (!$isDir && is_dir($oldPath)) {
        $errorMessage = '指定为文件，但原路径是目录';
        logError($errorMessage);
        return $errorMessage;
    }

    if (rename($oldPath, $newPath)) {
        return '重命名成功';
    } else {
        $errorMessage = '重命名失败: ' . error_get_last()['message'];
        logError($errorMessage);
        return $errorMessage;
    }
}

function moveUploadedFile($file, $destination)
{ 
    $fileInfo = pathinfo($file['name']); 

    if (!isset($file['tmp_name']) || !is_uploaded_file($file['tmp_name'])) { 
        $errorMessage = '无效的上传文件';
        logError($errorMessage);
        return false;
    }
    if (!move_uploaded_file($file['tmp_name'], $destination)) {
        $errorMessage = '移动上传文件失败: ' . error_get_last()['message'];
        logError($errorMessage);
        return false;
    }
    return true;
}

function createFolder($path)
{
    $path = normalizePath($path);

    if (file_exists($path)) {
        $errorMessage = '文件夹已存在';
        logError($errorMessage);
        return $errorMessage;
    }
    if (mkdir($path, 0777, true)) {
        return '文件夹创建成功';
    } else {
        $errorMessage = '文件夹创建失败: ' . error_get_last()['message'];
        logError($errorMessage);
        return $errorMessage;
    }
}

function removeFileOrDirectory($path)
{
    $path = normalizePath($path);
 

    if (!file_exists($path) && !is_dir($path)) {
        return '文件删除成功';
    }

    if (is_dir($path)) {
        $files = array_diff(scandir($path), array('.', '..'));
        foreach ($files as $file) {
            $filePath = $path . DIRECTORY_SEPARATOR . $file;
            if (is_dir($filePath)) {
                removeFileOrDirectory($filePath);
            } else {
                unlink($filePath);
            }
        }
        if (rmdir($path)) {
            return '目录及其内容删除成功';
        } else {
            $errorMessage = '目录删除失败: ' . error_get_last()['message'];
            logError($errorMessage);
            return $errorMessage;
        }
    } else {
        if (unlink($path)) {
            return '文件删除成功';
        } else {
            $errorMessage = '文件删除失败: ' . error_get_last()['message'];
            logError($errorMessage);
            return $errorMessage;
        }
    }
}

function createFile($path)
{
    $path = normalizePath($path); 
    

    if (isset($_FILES['file'])) {

        // 检查文件夹是否存在
        $directory = dirname($path);
        if (!is_dir($directory)) {
            if (!mkdir($directory, 0777, true)) {
                $errorMessage = '无法创建文件夹: ' . error_get_last()['message'];
                logError($errorMessage);
                return $errorMessage;
            }
        }
        $uploadResult = moveUploadedFile($_FILES['file'], $path);
        if (!$uploadResult) {
            $errorMessage = '文件上传失败';
            logError($errorMessage);
            return $errorMessage;
        }
        return '操作成功';
    } else {
        if (touch($path)) {
            return '空文件创建成功';
        } else {
            $errorMessage = '文件创建失败: ' . error_get_last()['message'];
            logError($errorMessage);
            return $errorMessage;
        }
    }
}

function modifyFileOrDirectory($path, $isDir)
{
    $path = normalizePath($path);
 

    if ($isDir) {
        $errorMessage = '不支持修改目录';
        logError($errorMessage);
        return $errorMessage;
    }

    if (!file_exists($path)) {
        $errorMessage = '文件不存在';
        logError($errorMessage);
        return $errorMessage;
    }

    if (isset($_FILES['file'])) {
        $uploadResult = moveUploadedFile($_FILES['file'], $path);
        if (!$uploadResult) {
            $errorMessage = '文件修改失败';
            logError($errorMessage);
            return $errorMessage;
        }
        return '文件修改成功';
    } else {
        $errorMessage = '未提供新文件内容';
        logError($errorMessage);
        return $errorMessage;
    }
}
